/* eslint-disable */
/**
* 数字工具类
*/
const utilNum = {
  /**
   * @description 保留几位小数（四舍五入法），结尾的0会舍弃掉
   *
   toFixed(1.1)= 1.1
   toFixed(1.10)=1.1
   toFixed(1.100)=1.1
   toFixed(1.123)=1.123
   * @param  cur 数字
  * @digits  小数位数，不传的话则为4位
   * @eg  this.utilNum.toFixed(111)
  */
  toFixed(cur, digit) {
    if (!cur) return 0
    digit = digit || 4
    if (typeof(cur)=='string') cur = Number(cur)
    let temp = cur.toFixed(digit);
    let i = 1;
    while (temp.charAt(temp.length - 1) === '0' && i <= digit) {
      if (i === digit) {
        temp = temp.substring(0, temp.length - 2);
      } else {
        temp = temp.substring(0, temp.length - 1);
      }
      i++;
    }
    return isNaN(temp) ? 0 : temp;
  },

  //判断是否是整数
  isInt(num) {
    return Number.isInteger(num) || Number(num)%1 === 0
  },

  //判断是否是整数
  isNum(num) {
    if (global.strings.isBlank(num)) return false
    return typeof num === 'number' || !isNaN(num)
  },
  //判断是否是正数
  isNumZS(num) {
    return /^\d+(?=\.{0,1}\d+$|$)/.test(num)
  },
  //数组求和
  sum(arr) {
    return eval(arr.join('+'))
  },

  /*
     * 将一个浮点数转成整数，返回整数和倍数。如 3.14 >> 314，倍数是 100
     * @param floatNum {number} 小数
     * @return {object}
     *   {times:100, num: 314}
     */
  toInteger(floatNum) {
    var ret = {times: 1, num: 0}
    if (Math.floor(floatNum) === floatNum) {
      ret.num = floatNum
      return ret
    }
    var strfi  = floatNum + ''
    var dotPos = strfi.indexOf('.')
    var len    = strfi.substr(dotPos+1).length
    var times  = Math.pow(10, len)
    var intNum = parseInt(floatNum * times + 0.5, 10)
    ret.times  = times
    ret.num    = intNum
    return ret
  },

  /*
     * 核心方法，实现加减乘除运算，确保不丢失精度
     * 思路：把小数放大为整数（乘），进行算术运算，再缩小为小数（除）
     *
     * @param a {number} 运算数1
     * @param b {number} 运算数2
     * @param digits {number} 精度，保留的小数点数，比如 2, 即保留为两位小数
     * @param op {string} 运算类型，有加减乘除（add/subtract/multiply/divide）
     *
     */
  _operation(a, b, digits, op) {
    var o1 = this.toInteger(a)
    var o2 = this.toInteger(b)
    var n1 = o1.num
    var n2 = o2.num
    var t1 = o1.times
    var t2 = o2.times
    var max = t1 > t2 ? t1 : t2
    var result = null
    switch (op) {
      case 'add':
        if (t1 === t2) { // 两个小数位数相同
          result = n1 + n2
        } else if (t1 > t2) { // o1 小数位 大于 o2
          result = n1 + n2 * (t1 / t2)
        } else { // o1 小数位 小于 o2
          result = n1 * (t2 / t1) + n2
        }
        return result / max
      case 'subtract':
        if (t1 === t2) {
          result = n1 - n2
        } else if (t1 > t2) {
          result = n1 - n2 * (t1 / t2)
        } else {
          result = n1 * (t2 / t1) - n2
        }
        return result / max
      case 'multiply':
        result = (n1 * n2) / (t1 * t2)
        return result
      case 'divide':
        result = (n1 / n2) * (t2 / t1)
        return result
    }
  },

  //加法运算
  numAdd(num1, num2) {
    return this._operation(num1, num2, 4, 'add')
  },

  //减法运算
  numSub(num1, num2) {
    return this._operation(num1, num2, 4, 'subtract')
  },

  //乘法运算
  numMul(num1, num2) {
    return this._operation(num1, num2, 4, 'multiply')
  },

  //除法运算
  divSub(num1, num2) {
    return this._operation(num1, num2, 4, 'divide')
  }
}

export default utilNum
